﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace IDE
{
    public partial class Form1 : Form
    {

        public static int MAXLINEA = 100;
        public static int MAXDIGIT = 5;
        public static int MAXID = 10;
        public static string PARSER = System.IO.Directory.GetCurrentDirectory() + @"\Parser\Ejecutable\pl0-parser.exe";

        public EditorForm edit;
        Consola consola;
        String nombreFuente;
        String nombreFuenteTemp;
        String pathFuente;

        public Form1()
        {
            InitializeComponent();

        }

        
            
  
/*****************************************************************************/
             private void Form1_Load(object sender, EventArgs e)
            {
                edit = new EditorForm(this);
                //edit.editor.TextChanged += editor_TextChanged;
                //edit.MdiParent = this;
                //edit.TextChanged += new System.EventHandler(edit_TextChanged)
                edit.Show();

                 //preparando la consola
                consola = new Consola(this);
                //consola.MdiParent = this;
                //Cargar valores por defecto en param.txt
                //cargarArchivoParam();
            }

             private void editor_TextChanged(object sender, EventArgs e)
             {
                 edit.editor.BackColor = Color.White;
             }
     
             private void toolStripButton1_Click(object sender, EventArgs e)
             {
                 //System.IO.StreamReader myStreamReader = null;
                 if (edit._modificado)
                 {
                     DialogResult resultado = MessageBox.Show("¿Desea guardar los cambios antes de proceder?", "Archivo modificado", MessageBoxButtons.YesNo);
                     if (resultado == DialogResult.Yes)
                     {
                         // guardar el archivo y compilar
                         guardar();
                         compilar();

                     }
                     else if (resultado == DialogResult.No)
                     {
                         MessageBox.Show("Guarde sus cambios antes de ejecutar el parser", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                     }

                 }
                 else
                 {
                     compilar();
                 }
            }

             private void compilar()
             {
                 try
                 {
                     edit.editor.SelectAll();
                     edit.editor.SelectionBackColor = Color.White;
                     String pathActual = System.IO.Directory.GetCurrentDirectory();
                     //myStreamReader = System.IO.File.OpenText(pathActual + @"\param.txt");
                     //String MAXLINEA = myStreamReader.ReadLine().Substring(9);
                     //String MAXDIGIT = myStreamReader.ReadLine().Substring(9);
                     //String MAXID = myStreamReader.ReadLine().Substring(6);
                     //String Ubicacion = myStreamReader.ReadLine().Substring(10);

                     String MAXLINEA = Convert.ToString(Form1.MAXLINEA);
                     String MAXDIGIT = Convert.ToString(Form1.MAXDIGIT);
                     String MAXID = Convert.ToString(Form1.MAXID);
                     String Ubicacion = Form1.PARSER;

                     //MessageBox.Show(MAXLINEA + " " + MAXDIGIT + " " + MAXID + " " + Ubicacion);
                     //myStreamReader.Close();
                     /*****************************************************************************************************************/
                     if (Application.OpenForms["consola"] == null)
                     {
                         consola = new Consola(this);
                         //consola.MdiParent = this;
                         consola.Show();
                     }

                     /*****************************************************************************************************************/
                     Process p = new Process();
                     p.StartInfo.UseShellExecute = false;
                     p.StartInfo.RedirectStandardOutput = true;
                     p.StartInfo.CreateNoWindow = true;
                     p.StartInfo.FileName = Ubicacion;
                     //p.StartInfo.Arguments = "scanner" + " \"" + nombreFuente + "\" " + MAXLINEA + " " + MAXDIGIT + " " + MAXID;
                     p.StartInfo.Arguments = "\"" + nombreFuente + "\" " + MAXLINEA + " " + MAXDIGIT + " " + MAXID;
                     //MessageBox.Show(p.StartInfo.Arguments);
                     p.Start();
                     consola.Console.Text = p.StandardOutput.ReadToEnd();
                     p.WaitForExit(); ;
                     p.Close();
                     p.Dispose();
                 }
                 catch (Exception ex) { MessageBox.Show(ex.StackTrace); }
                 finally
                 {
                     edit.editor.DeselectAll();
                     edit._modificado = false;
                     analizarError();
                 }
             }

             private void analizarError()
             {
                 string errorText = "^ error ";
                 bool error = consola.Console.Text.Contains(errorText);
                 if (error)
                 {
                     //encontrando el error
                     int finLineaError = consola.Console.Text.IndexOf(errorText)-2;
                     String temp = consola.Console.Text.Substring(0, finLineaError);
                     int inicioLineaError = temp.LastIndexOf("\n") + 1;
                     //MessageBox.Show(temp + " " + inicioLineaError + " " + finLineaError);
                     string lineaError = consola.Console.Text.Substring(inicioLineaError, finLineaError - inicioLineaError);
                     //consola.Console.Select(inicioLineaError, finLineaError-inicioLineaError);
                     
                     //seleccionando el texto del error
                     int inicioEditorError = edit.editor.Text.IndexOf(lineaError);
                     int finEditorError = edit.editor.Text.IndexOf("\n", inicioEditorError);
                     edit.editor.Select(inicioEditorError, finEditorError - inicioEditorError);
                     edit.editor.SelectionBackColor = Color.Yellow;
                     consola.lineaMarcadaError = edit.editor.SelectionStart;
                     edit.editor.Select(0, 0);
                     //edit.editor.Focus();
                     MessageBox.Show("Su codigo fuente tiene errores, favor verifique.", "Error de compilación", MessageBoxButtons.OK, MessageBoxIcon.Error);
                 }
             }

             private void newToolStripMenuItem_Click(object sender, EventArgs e)
             {
                 edit.editor.BackColor = Color.White;
                 consola.Console.Text = String.Empty;
                 nombreFuente = "";
                 //se utiliza el metodo clear para limpiar el texto del rich textbox
                 if (Application.OpenForms["EditorForm"] == null)
                 {
                     edit = new EditorForm(this);
                     //edit.MdiParent = this;
                     edit.Show();
                 }
                 else
                 {
                     edit.editor.Clear();
                     //consola.Close(); 
                 }
             }

             private void openToolStripMenuItem_Click(object sender, EventArgs e)
             {
                 //se crea un objeto de openfiledialogo que nos servira para abrir archivos
                 OpenFileDialog Open = new OpenFileDialog();
                 System.IO.StreamReader myStreamReader = null;
                 Open.InitialDirectory = System.IO.Directory.GetCurrentDirectory();
                 //se especifica que tipos de archivos se podran abrir y se verifica si existe
                 Open.Filter = "Text [*.txt*]|*.txt";
                 Open.CheckFileExists = true;
                 Open.Title = "Abrir Archivo";
                 Open.ShowDialog(this);
                 try
                 {
                     //Abro el archivo, este codigo se utiliza para que se pueda pueda mostrar la informacion del archivo que queremos abrir en el rich textbox
                     //Guardo la ruta del archivo fuente del archivo
                     pathFuente = System.IO.Path.GetDirectoryName(Open.FileName);
                     //Creo un archivo temporal
                     nombreFuenteTemp = System.IO.Path.GetTempFileName();
                     //Hago una copia temporal del archivo
                     System.IO.File.Copy(Open.FileName, nombreFuenteTemp, true);
                     myStreamReader = new System.IO.StreamReader(nombreFuenteTemp);
                     edit.editor.BackColor = Color.White;
                     edit.editor.Text = myStreamReader.ReadToEnd();
                     nombreFuente = Open.FileName;
                     myStreamReader.Close();
                     toolStripButton1.Enabled = true;
                     consola.Console.Text = String.Empty;
                 }
                 catch (Exception)
                 {
                 }
                 finally
                 {
                     edit._modificado = false;
                 }
                 
             }

             private void saveToolStripMenuItem_Click(object sender, EventArgs e)
             {
                 guardar();
             }

             private void guardar()
             {
                 if (System.IO.File.Exists(nombreFuente))
                 {
                     System.IO.StreamWriter myStreamWriter = null;
                     myStreamWriter = new System.IO.StreamWriter(pathFuente + @"\" + System.IO.Path.GetFileName(nombreFuente), false);
                     myStreamWriter.Write(edit.editor.Text);
                     //myStreamWriter.Flush();
                     myStreamWriter.Close();
                     edit.editor.SelectAll();
                     edit.editor.SelectionBackColor = Color.White;
                     edit.editor.DeselectAll();
                     consola.Console.Clear();
                 }
                 else
                 {
                     //se crea un objeto de tipo savefiledialog que nos servira para guardar el archivo
                     SaveFileDialog Save = new SaveFileDialog();
                     System.IO.StreamWriter myStreamWriter = null;
                     Save.InitialDirectory = System.IO.Directory.GetCurrentDirectory();
                     //al igual que para abrir el tipo de documentos aqui se especifica en que extenciones se puede guardar el archivo
                     Save.Filter = "Text (*.txt)|*.txt";
                     Save.CheckPathExists = true;
                     Save.Title = "Guardar";
                     Save.ShowDialog(this);
                     try
                     {
                         //este codigo se utiliza para guardar el archivo de nuestro editor
                         //Guardo la ruta del archivo fuente del archivo
                         pathFuente = System.IO.Path.GetDirectoryName(Save.FileName);
                         //Creo un archivo temporal
                         nombreFuenteTemp = System.IO.Path.GetTempFileName();
                         //Hago una copia temporal del archivo
                         myStreamWriter = System.IO.File.AppendText(Save.FileName);
                         myStreamWriter.Write(edit.editor.Text);
                         nombreFuente = Save.FileName;
                         myStreamWriter.Close();
                         toolStripButton1.Enabled = true;

                     }
                     catch (Exception) { }
                     finally
                     {
                         edit.editor.SelectAll();
                         edit.editor.SelectionBackColor = Color.White;
                         edit.editor.DeselectAll();
                         edit._modificado = false;
                     }
                 }
                 edit._modificado = false;
             }

             private void exitToolStripMenuItem_Click(object sender, EventArgs e)
             {
                 //se utiliza el metodo close para cerrar el formulario
                 Close();
             }

             private void copyToolStripMenuItem_Click(object sender, EventArgs e)
             {
                 //se utilza el metodo copy para copiar lo que este seleccionado en el rich textbox

             }

             private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
             {
                 //se utilza el metodo paste para pegar lo que tenemos copiado en el rich textbox
                 edit.editor.Paste();
             }

             private void undoToolStripMenuItem_Click(object sender, EventArgs e)
             {
                 
                 edit.editor.Undo();

             }

             private void redoToolStripMenuItem_Click(object sender, EventArgs e)
             {
                 edit.editor.Redo(); 

             }

             private void cutToolStripMenuItem_Click(object sender, EventArgs e)
             {
                 
                 edit.editor.Cut();
                 
             }

             private void customizeToolStripMenuItem_Click(object sender, EventArgs e)
             {
                 Config conf = new Config();
                 conf.MdiParent = this;
                 conf.Show();
                 //conf.Visible = true;

             }

             private void ayudaToolStripMenuItem_Click(object sender, EventArgs e)
             {
                 //String pathActualAyuda = System.IO.Directory.GetCurrentDirectory();
                 Process.Start("ayuda.pdf");
             }

             public void cargarArchivoParam() {
                 System.IO.StreamWriter myStreamWriter = null;
                 try
                 {
                    String pathActual = System.IO.Directory.GetCurrentDirectory();
                    myStreamWriter = new System.IO.StreamWriter(pathActual + @"\param.txt", false);
                    myStreamWriter.WriteLine("MAXLINEA;1000");
                    myStreamWriter.WriteLine("MAXDIGIT;5");
                    myStreamWriter.WriteLine("MAXID;10");
                    myStreamWriter.WriteLine("Ubicacion;" + pathActual + @"\scanner\objeto\Debug\scanner.exe");
                    myStreamWriter.Close();
                 }
                 catch (Exception) { }
             }

    }
}
